package com.demo.wrapper.interfaces;

import com.demo.wrapper.enums.BoolEnum;
import com.demo.wrapper.enums.ScoreModeEnum;

import java.util.function.Consumer;

/**
 * 关系接口
 *
 * @param <Wrapper> 条件拼接类，需继承Relation接口
 * @author 19242
 */
public interface IEsRelationWrapper<Wrapper extends IEsRelationWrapper<Wrapper>> extends IBaseWrapper<Wrapper> {
    /**
     * 后面的方法使用and关系
     *
     * @return this
     */
    default Wrapper and() {
        return check(BoolEnum.MUST);
    }

    /**
     * 后面的方法使用or关系
     *
     * @return this
     */
    default Wrapper or() {
        return check(BoolEnum.SHOULD);
    }

    /**
     * 后面的方法使用not关系
     *
     * @return this
     */
    default Wrapper not() {
        return check(BoolEnum.MUST_NOT);
    }

    /**
     * 后面的方法使用filter关系
     *
     * @return this
     */
    default Wrapper filter() {
        return check(BoolEnum.FILTER);
    }

    /**
     * or查询
     *
     * @param consumer 子查询条件函数
     * @return this
     */
    Wrapper or(Consumer<Wrapper> consumer);

    /**
     * and查询
     *
     * @param consumer 子查询条件函数
     * @return this
     */
    Wrapper and(Consumer<Wrapper> consumer);

    /**
     * 使用not关系
     *
     * @param consumer 子查询条件函数
     * @return this
     */
    Wrapper not(Consumer<Wrapper> consumer);

    /**
     * 使用filter关系
     *
     * @param consumer 子查询条件函数
     * @return this
     */
    Wrapper filter(Consumer<Wrapper> consumer);

    /**
     * 嵌套查询
     *
     * @param path     上级路径
     * @param consumer 子查询条件函数
     * @return this
     */
    default Wrapper nested(String path, Consumer<Wrapper> consumer) {
        return nested(path, consumer, ScoreModeEnum.None);
    }


    /**
     * 嵌套查询
     *
     * @param path      上级路径
     * @param consumer  嵌套条件函数
     * @param scoreMode 得分模式
     * @return wrapper
     */
    Wrapper nested(String path, Consumer<Wrapper> consumer, ScoreModeEnum scoreMode);

    /**
     * 切换关系
     *
     * @param boolEnum
     * @return
     */
    Wrapper check(BoolEnum boolEnum);

}
